# -*- coding: utf-8 -*-
"""
Created on Fri Oct 28 13:05:36 2011

@author: camsparr
"""

from BeautifulSoup import BeautifulSoup
from urllib import urlopen, urlretrieve
from pickle import load, dump
import os
import re
import sys

################################################################################
################## Regular Website GRABBER (a href links) ######################
################################################################################

def ahref_grabber(outdir, source):
    source = urlopen(source).read()
    files = os.listdir(outdir)
    soup = BeautifulSoup(source)
    urls = soup.findAll('a', href=re.compile('.mp3$'))
    mp3_urls = [l['href'] for l in urls] #not sure what this does...
    
    for url in mp3_urls:
        song = str(url).split('/')[-1:][0].replace(' ','').replace('%20','').strip()
        if song not in files:
            print('    Downloading ' + song)
            urlretrieve(url, outdir + song)
            
################################################################################
################## RSS feed GRABBER (media:content links) ######################
################################################################################

def rss_grabber(outdir, source):
    source = urlopen(source).read()
    files = os.listdir(outdir)
    soup = BeautifulSoup(source)
    items = soup.findAll('item')
    
    for item in items:
        song = str(item.findAll('title')[0])
        song = song.split('<title>')[1].split('</title>')[0].strip()
        song = song.replace(' ','').replace('/','--').replace('%20','') + '.mp3'
        if song not in files:
            songurl = str(item.findAll('media:content')[0]).split('"')[1]
            print('    Downloading ' + song)
            urlretrieve(songurl, outdir + song)
            
################################################################################
################## Driver Function #############################################
################################################################################            
            
#def grab_songs(indir, outdir):
    
    ############################## GRAB WEBSITES ################################
    
    #href = load(open(indir + 'href.dat','r'))
    
    #i = 0
    #for feed in href:
        #print('Grabbing ' + feed)
        #outdirtemp = outdir + feed + '/'
        #ahref_grabber(outdirtemp, href[feed])
        #i = i + 1
        
    ############################## GRAB RSS #####################################
    
    #rss = load(open(indir + 'rss.dat','r'))
    
    #i = 0
    #for feed in rss:
        #print('Grabbing ' + feed)
        #outdirtemp = outdir + feed + '/'
        #rss_grabber(outdirtemp, rss[feed])
        #i = i + 1
    
    #print('\n*** Done downloading ***\n')

################################################################################
################## Option prompter #############################################
################################################################################    
    
#def options(indir, outdir, option = '0'):
    #if option == '0':
        #print('Select an option:')
        #print('   1. run mpy3 grabber   2. add url   3. remove url   4. exit')
        #option = raw_input('   enter 1, 2, 3, or 4: ')
    
    #if option == '1':
        #grab_songs(indir, outdir)
    #elif option == '2':
        #url = raw_input('\nenter FULL url: ').strip()
        #if not url.startswith('http://'):
			#print('\nPlease enter a FULL url (beginning with http://...)\n')
			#options(indir, outdir, '2')
			#sys.exit()
        #else:
            #d = raw_input('\nenter feed name: ').strip().replace(' ','_')
            #urltype = determine_url(url)
            #add_feed(url, urltype, indir, outdir, d)
    #elif option == '3':
		#rem_feed(indir, outdir)
    #elif option == '4':
        #return True
    #else:
        #print('\nnot an option... try again.\n')
    
    #options(indir, outdir)
    
################################################################################
################## url determiner ##############################################
################################################################################

def determine_url(url):
    print('Determining feed type...')
    # this function determines the type of url given (ahref files or RSS)
    source = urlopen(url).read()
    soup = BeautifulSoup(source)
    urls = soup.findAll('a', href=re.compile('.mp3$')) # from ahref grabber
    items = soup.findAll('item') # from rss grabber
    
    if len(urls) > 0:
        return 'ahref'
    elif len(items) > 0:
        return 'rss'
    else:
        return 'none'

################################################################################
################## add a feed ##################################################
################################################################################

def add_feed(url, urltype, indir, outdir, d):
    print('Adding feed...')
    if urltype == 'rss':
        rss = load(open(indir + 'rss.dat','r'))
        rss[d] = url
        dump(rss, open(indir + 'rss.dat', 'w'))
        os.system('mkdir ' + outdir + d)
    elif urltype == 'ahref':
        href = load(open(indir + 'href.dat','r'))
        href[d] = url
        dump(href, open(indir + 'href.dat', 'w'))
        os.system('mkdir ' + outdir + d)
    else:
        print('\nUnsupported feed type!\n')

################################################################################
################## remove a feed ###############################################
################################################################################

def rem_feed(indir, outdir):
	print('\n')
	count = 0
	temp = {}
	rss = load(open(indir + 'rss.dat', 'r'))
	href = load(open(indir + 'href.dat', 'r'))
	for d in rss:
		print(str(count) + ': ' + d)
		temp[str(count)] = d
		count = count + 1
	for di in href:
		print(str(count) + ': ' + di)
		temp[str(count)] = di
		count = count + 1
	print(str(count) + ': CANCEL')
	
	delete = raw_input('Which would you like to delete?\n    enter 0 to ' + str(count) + ': ')
	if delete == str(count):
		print('\ndeletion cancelled!\n')
	else:
		item = temp[delete]
		if rss.has_key(item):
			rss.pop(item)
			print('\n' + item + ' Deleted\n')
		elif href.has_key(item):
			href.pop(item)
			print('\n' + item + ' Deleted\n')
		else:
			print('\nInvalid entry!\n')
	
	dump(rss, open(indir + 'rss.dat', 'w'))
	dump(href, open(indir + 'href.dat', 'w'))
